package com.whfc.fmam.service;

import com.whfc.common.exception.BizException;
import com.whfc.common.result.ListData;
import com.whfc.common.result.PageData;
import com.whfc.fmam.entity.dto.*;
import com.whfc.fmam.entity.qo.RecvSendAnalysisQO;
import com.whfc.fmam.entity.qo.WeighNoteAddQO;
import com.whfc.fmam.entity.qo.WeighNoteListQO;
import com.whfc.fmam.entity.qo.WeighNoteQO;

import java.io.IOException;
import java.util.Date;
import java.util.List;


/**
 * @author sun_guodong
 * @description 磅单服务
 * @date 2019-11-25
 */
public interface FmamWeighNoteService {

    /**
     * 收发料明细台账列表服务
     *
     * @param request
     * @return
     */
    PageData<FmamWeighNoteDTO> list(WeighNoteListQO request) throws BizException;

    /**
     * 查询磅单详情
     *
     * @param id
     * @return
     */
    FmamWeighNoteDetailDTO detail(Long id) throws BizException;

    /**
     * 查询磅单详情
     *
     * @param guid
     * @return
     */
    FmamWeighNoteDetailDTO info(String guid) throws BizException;


    /**
     * 按材料明细进行收料和发料汇总分析
     *
     * @param request
     * @return
     */
    FmamRecvSendAnaDTO analysisByMat(RecvSendAnalysisQO request) throws BizException;

    /**
     * 按材料类别进行收料和发料汇总分析
     *
     * @param request
     * @return
     * @throws BizException
     */
    FmamRecvSendAnaDTO analysisByMatType(RecvSendAnalysisQO request) throws BizException;

    /**
     * 收发料汇总分析之根据材料类别查找磅单列表
     *
     * @param pageNum
     * @param pageSize
     * @param matTypeId
     * @param type
     * @param diffResult
     * @return
     * @throws BizException
     */
    PageData<FmamRecvSendAnaMatDTO> getWeighNoteListByMatType(Integer pageNum, Integer pageSize, Long matTypeId, Integer type, Integer diffResult) throws BizException;

    /**
     * 收发料汇总分析之根据材料id查找磅单列表
     *
     * @param pageNum
     * @param pageSize
     * @param matId
     * @param type
     * @param diffResult
     * @return
     * @throws BizException
     */
    PageData<FmamRecvSendAnaMatDTO> getWeighNoteListByMatId(Integer pageNum, Integer pageSize, Long matId, Integer type, Integer diffResult) throws BizException;


    /**
     * 按材料类型分析--获取材料类型ID集合
     *
     * @param request
     * @return
     */
    List<FmamSendSupplierDTO> analysisBySupplier(RecvSendAnalysisQO request) throws BizException;

    /**
     * 供应商供货明细列表服务
     *
     * @param request
     * @return
     */
    FmamSendDetailAnaDTO sendSupplierList(RecvSendAnalysisQO request) throws BizException;

    /**
     * 供应商偏差情况分析超负差数列表服务
     *
     * @param request
     * @return
     */
    List<FmamSendSupplierDTO> getSupplierDiffNum(RecvSendAnalysisQO request) throws BizException;

    /**
     * 供应商偏差情况分析超负差率列表服务
     *
     * @param request
     * @return
     */
    List<FmamSendSupplierDTO> getSupplierDiffRate(RecvSendAnalysisQO request) throws BizException;

    /**
     * 供应商供货偏差情况分析,按材料明细分组
     *
     * @param request
     * @return
     */
    ListData<FmamSupplierAnaMatDTO> supplierAnaByMatGroup(RecvSendAnalysisQO request) throws BizException;

    /**
     * 供应商偏差分析数据统计
     */
    FmamRecvSendAnaDTO analysisDiffData(RecvSendAnalysisQO request) throws BizException;

    /**
     * 根据供应商id查找磅单列表
     *
     * @param sendSupplierId
     * @param pageNum
     * @param pageSize
     * @param diffResult
     * @return
     */
    PageData<FmamRecvSendAnaMatDTO> getWeighNoteListBySupplier(Integer sendSupplierId, Integer pageNum, Integer pageSize, Integer diffResult) throws BizException;

    /**
     * 导出收发料汇总分析数据
     *
     * @param request request
     * @return String
     */
    String exportAnalysisByMatData(RecvSendAnalysisQO request) throws IOException;

    /**
     * 导出供应商供货偏差分析数据
     *
     * @param request
     * @return
     */
    String exportAnalysisBySupplierData(RecvSendAnalysisQO request) throws IOException;

    /**************微信小程序调用**************/

    /**
     * 新增磅单  微信小程序使用
     *
     * @param weighNoteAddQO 新增磅单参数
     * @throws BizException
     */
    void add(WeighNoteAddQO weighNoteAddQO) throws BizException;

    /**
     * 上传磅单图片  微信小程序使用
     *
     * @param imgType 图片类型
     * @param imgUrl  图片地址
     * @return 图片信息DTO
     * @throws BizException
     */
    FmamWeighNoteImgDTO uploadImg(Integer imgType, String imgUrl) throws BizException;

    /**
     * 获取磅单数量统计  微信小程序使用
     * <p>
     * weighNoteQO  磅单查询参数QO
     *
     * @return 磅单统计DTO
     * @throws BizException
     */
    FmamWeighNoteTotalDTO getWeighNoteTotal(WeighNoteQO weighNoteQO) throws BizException;

    /**
     * 磅单统计  微信小程序使用
     *
     * @param weighNoteQO 磅单查询参数QO
     * @return 磅单统计DTO
     * @throws BizException
     */
    FmamWeighNoteCountDTO weighNoteCount(WeighNoteQO weighNoteQO) throws BizException;

    /**
     * 磅单根据收发料类型统计 --日统计  微信小程序使用
     *
     * @param weighNoteQO 磅单查询参数QO
     * @return 磅单统计DTO
     * @throws BizException
     */
    FmamWeighNoteTotalDTO recvSendTypeTotalByDay(WeighNoteQO weighNoteQO) throws BizException;

    /**
     * 磅单根据收发料类型统计 --月统计  微信小程序使用
     * <p>
     * weighNoteQO 磅单查询参数QO
     *
     * @return 磅单统计DTO
     * @throws BizException
     */
    FmamWeighNoteTotalDTO recvSendTypeTotalByMonth(WeighNoteQO weighNoteQO) throws BizException;

    /**
     * 磅单根据收发料类型统计 --累计统计  微信小程序使用
     * <p>
     * weighNoteQO 磅单查询参数QO
     *
     * @return 磅单统计DTO
     * @throws BizException
     */
    FmamWeighNoteTotalDTO recvSendTypeTotal(WeighNoteQO weighNoteQO) throws BizException;

    /**
     * 根据收发料类型和日期获取磅单列表 微信小程序使用
     *
     * @param weighNoteListQO 获取磅单列表请求参数
     * @return 磅单列表
     * @throws BizException
     */
    PageData<FmamWeighNoteDTO> listByRecvSendTypeAndDay(WeighNoteListQO weighNoteListQO) throws BizException;

    /**
     * 根据收发料类型和月份获取磅单列表  微信小程序使用
     *
     * @param weighNoteListQO 获取磅单列表请求参数
     * @return 磅单列表
     * @throws BizException
     */
    PageData<FmamWeighNoteDTO> listByRecvSendTypeAndMonth(WeighNoteListQO weighNoteListQO) throws BizException;

    /**
     * 根据收发料类型获取磅单列表  微信小程序使用
     *
     * @param weighNoteListQO 获取磅单列表请求参数
     * @return 磅单列表
     * @throws BizException
     */
    PageData<FmamWeighNoteDTO> listByRecvSendType(WeighNoteListQO weighNoteListQO) throws BizException;

    /**
     * 根据材料ID获取磅单列表  微信小程序使用
     *
     * @param weighNoteListQO 获取磅单列表请求参数
     * @return 磅单列表
     * @throws BizException
     */
    PageData<FmamWeighNoteDTO> listByMatId(WeighNoteListQO weighNoteListQO) throws BizException;

    /**
     * 磅单材料分析
     *
     * @param weighNoteQO 磅单请求参数
     * @return 材料分析列表
     * @throws BizException
     */
    ListData<FmamWeighNoteAnalysisDTO> analysis(WeighNoteQO weighNoteQO) throws BizException;


    /**
     * 导出收发料明细台账列表
     *
     * @param request
     * @return
     * @throws BizException
     */
    String export(WeighNoteListQO request) throws BizException, IOException;


    /**
     * 生成演示数据
     *
     * @param deptId 组织机构ID
     * @param plate  车牌号
     * @param date   日期
     */
    void generateDemoData(Integer deptId, String plate, Date date);


    /**
     * 材料进出场日报
     * @param deptId
     * @param weightNoteType
     * @param startTime
     * @param endTime
     * @param pageNum
     * @param pageSize
     * @return
     * @throws BizException
     */
    PageData<FmamWeighNoteDailyDTO> daily(Integer deptId, Integer weightNoteType, Date startTime, Date endTime, Integer pageNum, Integer pageSize) throws BizException;

    /**
     * 材料进出场日报
     *
     * @param deptId
     * @param weightNoteType
     * @param startTime
     * @param endTime
     * @return
     * @throws BizException
     */
    List<FmamWeighNoteDailyDTO> daily(Integer deptId, Integer weightNoteType, Date startTime, Date endTime) throws BizException;

}


